/*
因为a^a = 0，先遍历数组对所有数异或，得到两个只出现一次的数的异或结果eor
通过eor & - eor取得eor的最右边的1，令其为rightOne。因为两个数对应位不同异或后该位才会为1，所以rightOne对应位在两个数中一定是一个为0，一个为1，这是在为后面分组做准备
再遍历数组，每个数和rightOne与，将所有数分成与运算后为0和为1两组，要找的两个数分别在两组
把其中一组的所有数异或，得到其中一个要找的数res，另一个数即为res ^ eor
 */
public class Single_number_iii {
        public int[] singleNumber(int[] nums) {
            int eor = 0;
            for(int num : nums){
                eor ^= num;
            }
            int rightOne = eor & (- eor);
            int res = 0;
            for(int num : nums){
                if((num & rightOne) != 0){
                    res ^= num;
                }
            }
            return new int[]{res, res ^ eor};
        }
}
